"""
NPY文件转CSV转换器
读取npy文件并转换为CSV格式，便于分析和可视化
"""

import numpy as np
import pandas as pd
import os
from datetime import datetime, timedelta

def load_npy_data(filepath):
    """
    加载npy文件数据
    """
    try:
        data = np.load(filepath)
        print(f"成功加载npy文件: {filepath}")
        print(f"数据形状: {data.shape}")
        print(f"数据类型: {data.dtype}")
        print(f"数据范围: {data.min():.4f} 到 {data.max():.4f}")
        return data
    except Exception as e:
        print(f"加载npy文件失败: {e}")
        return None

def analyze_npy_data(data):
    """
    分析npy数据的结构
    """
    print("\n数据详细分析:")
    print("=" * 50)
    print(f"维度数量: {data.ndim}")
    print(f"总元素数: {data.size}")
    
    if data.ndim == 1:
        print("一维数组")
        print(f"长度: {len(data)}")
        print("前10个元素:")
        print(data[:10])
        
    elif data.ndim == 2:
        print("二维数组")
        print(f"行数: {data.shape[0]}, 列数: {data.shape[1]}")
        print("前5行数据:")
        print(data[:5])
        
        # 分析每列的数据
        print("\n每列统计信息:")
        for i in range(data.shape[1]):
            col_data = data[:, i]
            print(f"列 {i}: 均值={col_data.mean():.4f}, 标准差={col_data.std():.4f}, "
                  f"最小值={col_data.min():.4f}, 最大值={col_data.max():.4f}")
    
    elif data.ndim == 3:
        print("三维数组")
        print(f"维度: {data.shape}")
        print("第一个切片的前5行:")
        print(data[0, :5])
    
    else:
        print(f"高维数组: {data.shape}")
        print("前几个元素:")
        print(data.flatten()[:10])

def create_column_names(num_columns):
    """
    根据列数创建列名
    """
    # 热电厂常见的测点名称
    common_names = [
        '时间戳',
        '机组负荷_MW',
        '主汽流量_t_h', 
        '主汽压力_MPa',
        '主汽温度_℃',
        '再热蒸汽压力_MPa',
        '再热蒸汽温度_℃',
        '凝结水泵出口母管温度_℃',
        '凝结水流量_t_h',
        '主给水流量_t_h',
        '主给水温度_℃',
        '给水流量_t_h',
        '凝结水流量_2_t_h',
        '凝结水温度_℃',
        '风机转速_rpm',
        '效率系数',
        '传热系数',
        '流量系数',
        '背压_kPa',
        '背压_MPa',
        '环境温度_℃',
        '冷却塔效率',
        '凝汽器效率',
        '系统效率',
        '综合效率',
        '净效率'
    ]
    
    # 如果列数超过预定义名称，用数字补充
    if num_columns <= len(common_names):
        return common_names[:num_columns]
    else:
        names = common_names.copy()
        for i in range(len(common_names), num_columns):
            names.append(f'测点_{i}')
        return names

def convert_to_dataframe(data, start_time=None):
    """
    将numpy数组转换为DataFrame
    """
    if data.ndim == 1:
        # 一维数组，转换为单列DataFrame
        df = pd.DataFrame(data, columns=['数值'])
        
    elif data.ndim == 2:
        # 二维数组
        num_columns = data.shape[1]
        column_names = create_column_names(num_columns)
        
        # 创建DataFrame
        df = pd.DataFrame(data, columns=column_names)
        
        # 如果第一列看起来像时间戳，尝试转换
        if column_names[0] == '时间戳' and start_time is None:
            # 检查第一列是否可能是时间戳
            first_col = data[:, 0]
            if first_col.min() > 1e9:  # Unix时间戳
                df['时间戳'] = pd.to_datetime(first_col, unit='s')
            elif first_col.min() > 1e6:  # 毫秒时间戳
                df['时间戳'] = pd.to_datetime(first_col, unit='ms')
            else:
                # 假设是相对时间，创建时间序列
                start_time = datetime.now() - timedelta(hours=len(data))
                time_range = pd.date_range(start=start_time, periods=len(data), freq='5min')
                df['时间戳'] = time_range
        else:
            # 创建时间序列
            if start_time is None:
                start_time = datetime.now() - timedelta(hours=len(data))
            time_range = pd.date_range(start=start_time, periods=len(data), freq='5min')
            df.insert(0, '时间戳', time_range)
    
    else:
        # 高维数组，展平后处理
        print("高维数组，进行展平处理...")
        flattened_data = data.flatten()
        df = pd.DataFrame(flattened_data, columns=['数值'])
    
    return df

def save_to_csv(df, output_filename, output_dir='csv_data'):
    """
    保存DataFrame到CSV文件
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 设置时间戳为索引
    if '时间戳' in df.columns:
        df.set_index('时间戳', inplace=True)
    
    # 保存到CSV
    filepath = os.path.join(output_dir, output_filename)
    df.to_csv(filepath, encoding='utf-8-sig')
    
    print(f"\n数据已保存到: {filepath}")
    print(f"数据形状: {df.shape}")
    if '时间戳' in df.columns or df.index.name == '时间戳':
        print(f"时间范围: {df.index.min()} 到 {df.index.max()}")
    
    return filepath

def generate_data_summary(df, output_dir='csv_data'):
    """
    生成数据摘要报告
    """
    summary_file = os.path.join(output_dir, 'data_summary.txt')
    
    with open(summary_file, 'w', encoding='utf-8') as f:
        f.write("热电厂数据摘要报告\n")
        f.write("=" * 50 + "\n")
        f.write(f"生成时间: {datetime.now()}\n")
        f.write(f"数据行数: {len(df)}\n")
        f.write(f"数据列数: {len(df.columns)}\n")
        
        if df.index.name == '时间戳':
            f.write(f"时间范围: {df.index.min()} 到 {df.index.max()}\n")
            f.write(f"时间间隔: {df.index[1] - df.index[0]}\n")
        
        f.write("\n各列统计信息:\n")
        f.write("-" * 30 + "\n")
        
        for col in df.columns:
            if df[col].dtype in ['float64', 'float32', 'int64', 'int32']:
                f.write(f"{col}:\n")
                f.write(f"  平均值: {df[col].mean():.4f}\n")
                f.write(f"  最大值: {df[col].max():.4f}\n")
                f.write(f"  最小值: {df[col].min():.4f}\n")
                f.write(f"  标准差: {df[col].std():.4f}\n")
                f.write(f"  缺失值: {df[col].isnull().sum()}\n\n")
    
    print(f"数据摘要已保存到: {summary_file}")

def main():
    """
    主函数
    """
    print("=" * 60)
    print("NPY文件转CSV转换器")
    print("=" * 60)
    
    # 查找npy文件
    npy_files = [f for f in os.listdir('.') if f.endswith('.npy')]
    
    if not npy_files:
        print("当前目录下未找到npy文件")
        return
    
    print(f"找到 {len(npy_files)} 个npy文件:")
    for i, file in enumerate(npy_files, 1):
        print(f"{i}. {file}")
    
    # 处理第一个npy文件（通常是8月数据.npy）
    npy_file = npy_files[0]
    print(f"\n处理文件: {npy_file}")
    
    # 加载数据
    data = load_npy_data(npy_file)
    if data is None:
        return
    
    # 分析数据
    analyze_npy_data(data)
    
    # 转换为DataFrame
    print(f"\n转换为DataFrame...")
    df = convert_to_dataframe(data)
    
    # 显示DataFrame信息
    print(f"\nDataFrame信息:")
    print(f"形状: {df.shape}")
    print(f"列名: {list(df.columns)}")
    print("\n前5行数据:")
    print(df.head())
    
    # 保存为CSV
    output_filename = npy_file.replace('.npy', '.csv')
    csv_filepath = save_to_csv(df, output_filename)
    
    # 生成数据摘要
    generate_data_summary(df)
    
    print(f"\n转换完成！")
    print(f"CSV文件: {csv_filepath}")
    print(f"数据摘要: csv_data/data_summary.txt")

if __name__ == "__main__":
    main() 